package com.kaifamiao.month03.day0317;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

public class Bank {

    Scanner in = new Scanner(System.in); // 创建输入对象
    ArrayListForUser list = new ArrayListForUser();  // 存储用户信息的 list
    SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
    SimpleDateFormat cdf = new SimpleDateFormat("yyyyMMddHHmmssSSSS"); // 生成流水号 格式
    ArrayListForCookies cookiesList = new ArrayListForCookies(); // 存储用户流水的 list
    User loginUser = null;

    public static void main(String[] args) {
        Bank bank = new Bank();
        bank.start();
    }

    /**
     * 欢迎界面
     */
    public void start(){
        print("****************************");
        print("*     欢迎光临开发喵银行      *");
        print("****************************");
        menu();
    }

    /**
     * 开始菜单界面
     */
    public void menu(){
        print("请按照要求输入您要操作的业务：");
        print("1.开户");
        print("2.登录");
        print("3.查询所有账户");
        print("4.查询所有流水记录");
        print("0.退出");
        int type = in.nextInt();
        typeSelect(0, type);
    }

    /**
     * 登录菜单界面
     */
    public void loginMenu(){
        Date now = new Date();
        print("亲爱的 " + loginUser.name + " ,欢迎来到开发喵银行！" + df.format(now));
        print("请按照要求输入您要操作的业务类型：");
        print("1.查看账户信息");
        print("2.存款");
        print("3.取款");
        print("4.查询余额");
        print("5.查询流水记录");
        print("9.销户");
        print("0.返回主页面");
        int type = in.nextInt();
        typeSelect(1,type);
    }

    /**
     * 获取操作类型
     * @param type 需要判断的操作类型的数字
     */
    public void typeSelect(int menuCode, int type){
        if(menuCode == 0){
            switch (type) {
                case 1 -> creatUser(); // 创建用户
                case 2 -> login(); // 登录
                case 3 -> find();  // 查询所有账户信息
                case 4 -> allCookies(); // 查询流水记录
                case 0 -> quit(); // 退出账户
                default -> menu();
            }
        }else if(menuCode == 1){
            switch (type){
                case 1 -> searchUser(); // 查询用户信息
                case 2 -> deposit(); // 存款业务
                case 3 -> withdrawal(); // 取款业务
                case 4 -> searchMoney(); // 查询余额
                case 5 -> findCookies(); // 查询余额
                case 9 -> logout(); // 注销账户
                case 0 -> exit(); // 退出账户
                default -> loginMenu(); // 返回登录成功界面
            }
        }
    }

    /**
     * 创建用户
     */
    public void creatUser(){
        print("请输入用户姓名：");
        User user = new User();
        user.name = in.next();
        while(true){
            print("请输入密码：");
            user.password = in.next();
            print("请确认密码：");
            String rePass = in.next();
            if(!rePass.equals(user.password)){
                print("两次密码不一致，请重新输入... 输入q 返回菜单界面");
                String s = in.next();
                if("q".equals(s)){
                    menu();
                }
            }else{
                break;
            }
        }
        while(true){
            print("请输入电话号码：");
            user.phone = in.next();
            if(user.phone.length() != 11){
                print("请输入正确的手机号码...");
            }else {
                break;
            }
        }
        user.money = 0.0;
        user.card = System.currentTimeMillis();
        user.no = list.count;
        print("创建用户成功！");
        print("卡号：" + user.card);
        list.add(user);
        menu();
    }

    /**
     * 用户登录
     */
    public void login(){
        print("请输入电话号码：");
        String phone = in.next();
        int index = getIndex(phone);
        if(index != -1){
            while(true){
                print("请输入密码：");
                String pass = in.next();
                if(pass.equals(list.users[index].password)){
                    loginUser = list.indexOf(index);
                    loginMenu(); // 密码正确进入登录成功界面
                    break;
                }else{
                    print("小可爱，你把密码记错了。"); // 密码错误重新输入账户号，密码
                }
            }
        }else{
            print("账户不存在，请重新输入...");
            login();
        }
    }

    /**
     * 显示所有用户信息
     */
    public void find(){
        print("当前共有：" + list.count() + " 人");
        for(int i = 0; i < list.count(); i ++){
            list.indexOf(i).show();
        }
        menu();
    }

    /**
     * 所有用户流水
     */
    public void allCookies(){
        for(int i = 0; i < cookiesList.count(); i ++){
            print(cookiesList.indexOf(i).toString());
        }
        menu();
    }
    /**
     * 根据电话获取用户所在数组的下标
     * @param phone 用户输入的电话号码
     */
    public int getIndex(String phone){
        for(int i = 0; i < list.count(); i ++){
            if(phone.equals(list.users[i].phone)){
                return i;
            }
        }
        return -1; // 没找到返回-1
    }

    /**
     * 查询用户信息
     */
    public void searchUser(){
        print("用户姓名：" + loginUser.name);
        print("电话号码：" + loginUser.phone);
        print("卡号：" + loginUser.card);
        loginMenu();
    }

    /**
     * 存款业务
     */
    public void deposit(){
        print("请输入您要存的金额：");
        double money = in.nextDouble();
        loginUser.money += money;
        print("存款成功！");
        addCookies(0,money); // 记录流水
        searchMoney();
        loginMenu();
    }

    /**
     * 添加流水记录
     * @param operation 操作类型
     * @param money 金额
     */
    public void addCookies(int operation,double money){
        Cookies cookies = new Cookies();
        Date date = new Date();
        cookies.number = cdf.format(date);
        cookies.operation = operation;
        cookies.money = money;
        cookies.phone = loginUser.phone;
        cookies.card = String.valueOf(loginUser.card);
        cookiesList.add(cookies);
    }
    /**
     * 取款业务
     */
    public void withdrawal(){
        while(true){
            print("请输入您要取的金额：");
            double money = in.nextDouble();
            if(money <= loginUser.money){
                loginUser.money -= money;
                print("取款成功！");
                addCookies(1,money); // 记录流水
                searchMoney();
                break;
            }else{
                print("余额不足！");
                if(loginUser.money == 0.0){
                    print("您的余额为 0 ，请先存款：");
                    deposit();
                }
            }
        }
        loginMenu();
    }

    /**
     * 查询余额
     */
    public void searchMoney(){
        print("账户余额：" + loginUser.money);
        loginMenu();
    }

    /**
     * 判断是否相等
     */
    public boolean isEquals(int n, int i){
        return list.indexOf(n).phone.equals(cookiesList.indexOf(i).phone);
    }
    /**
     * 查询用户流水
     */
    public void findCookies(){
        int n = getIndex(loginUser.phone);
        for(int i = 0; i < cookiesList.count(); i ++){
            if(isEquals(n,i)){
                print(cookiesList.indexOf(i).toString());
            }
        }
        loginMenu();
    }

    /**
     * 注销账户
     */
    public  void logout(){
        list.remove(loginUser);
        print("注销成功");
        loginUser = null;
        menu();
    }

    /**
     * 退出登录
     */
    public void exit(){
        System.out.println("确定退出?（y 确定 n 取消）");
        String e = in.next();
        if("y".equals(e)){
            loginUser = null;
            menu();
        }else if("n".equals(e)){
            loginMenu();
        }
    }

    /**
     * 强制退出界面
     */
    public void quit(){
        System.out.println("确定退出?（y 确定 n 取消）");
        String e = in.next();
        if("y".equals(e)){
            System.out.println("系统即将退出，请注意保存您的数据...");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException em) {
                em.printStackTrace();
            }
            print("****************************");
            print("*     欢迎光临开发喵银行      *");
            print("****************************");
            System.exit(0);
        }else{
            menu();
        }
    }

    /**
     * 向控制台输出字符串
     * @param str 想要输出的字符串
     */
    public void print(String str){
        System.out.println(str);
    }
}

